# @Time : 2024-10-25 13:57
# @Author : Fioman 
# @Phone : 13149920693
"""
Python中的变量: 本质上是指向对象的一个名称或者是标签,类似于别名.它相当于是一个引用,可以看成是一个万能
的指针,可以指向一切的类型.它引用了内存中实际的数据对象.
"""
x = 10  # 这一行代码的意思就是,先创建一个对象  10 ,然后变量x指向10这个对象,就是引用这个对象
y = x  # 然后y也引用10这个对象

x = [1, 2, 3]  # 现在x又引用到了[1,2,3]这个对象了,就是指向
# python 中的变量赋值,都是先创建后面的对象,然后将后面对象的地址赋值给前面的变量,本质上是引用

# region 1. is 和 == 的区别?
# is: 用于比较两个对象是否引用同一个对象,本质上是判断id(a) == id(b) 是否相等
# ==: 用于比较两个对象的值是否相等,本质上是调用__eq__(self,other) 魔法方法,如果没有实现,
# 本质上是调用了object的 __eq__方法,还是比较两个对象的id()是否相等,我们可以测试一下
lst = [1, 2, 3]
lst2 = [1, 2, 3]
print(lst2 is lst)  # False
print(lst2 == lst)  # True ,以为lst实现了__eq__方法,所以他们相等


# 我们自定义一个list,来比较一下
class Mylist(object):
    def __init__(self, data):
        self.data = data


mylist = Mylist([1, 2, 3])
mylist2 = Mylist([1, 2, 3])
print(mylist is mylist2)  # False
print(mylist2 == mylist)  # False


# 假如我们实现一下eq方法呢?

class Mylist2(object):
    def __init__(self, data):
        self.data = data

    def __eq__(self, other):
        return self.data == other.data


mylist2 = Mylist2([1, 2, 3])
mylist = Mylist2([1, 2, 3])
print(mylist is mylist2, mylist == mylist2)  # False True

# endregion

# region 2. del语句和垃圾回收
"""
del语句: 是一个删除变量的语句,它会解除变量对对象的引用,即从当前作用域中移除变量名
               del语句不会删除对象本身,除非该对象没有了其他引用
垃圾回收: 引用计数和循环垃圾回收.
                 当一个对象被引用的时候,计数+1,解除的时候(比如del语句或者重新赋值,计数-1)
                 若计数为0,表示对象不可达,对象会被立即回收
"""

a = [1, 2, 3, 4, 5, 6, 7]
b = a  # 现在b和a引用了同一个对象
del a
print(b)  # a和b指向了同一个对象,删除了a,b一样可以访问这个对象,就是因为删除a的时候,只是减小了一个引用
# 计数
# print(a)  # 报错了

# endregion
